//给定链表头结点 head，该链表上的每个结点都有一个 唯一的整型值 。同时给定列表 nums，该列表是上述链表中整型值的一个子集。 
//
// 返回列表 nums 中组件的个数，这里对组件的定义为：链表中一段最长连续结点的值（该值必须在列表 nums 中）构成的集合。 
//
// 
//
// 示例 1： 
//
// 
//
// 
//输入: head = [0,1,2,3], nums = [0,1,3]
//输出: 2
//解释: 链表中,0 和 1 是相连接的，且 nums 中不包含 2，所以 [0, 1] 是 nums 的一个组件，同理 [3] 也是一个组件，故返回 2。 
//
//
// 示例 2： 
//
// 
//
// 
//输入: head = [0,1,2,3,4], nums = [0,3,1,4]
//输出: 2
//解释: 链表中，0 和 1 是相连接的，3 和 4 是相连接的，所以 [0, 1] 和 [3, 4] 是两个组件，故返回 2。 
//
// 
//
// 提示： 
//
// 
// 链表中节点数为n 
// 1 <= n <= 10⁴ 
// 0 <= Node.val < n 
// Node.val 中所有值 不同 
// 1 <= nums.length <= n 
// 0 <= nums[i] < n 
// nums 中所有值 不同 
// 
// Related Topics数组 | 哈希表 | 链表 
//
// 👍 127, 👎 0 
//
//
//
//

package leetcode.editor.day;

import java.util.HashSet;
import java.util.Set;

// 817. 链表组件
// https://leetcode.cn/problems/linked-list-components/
class LinkedListComponents {
    public static void main(String[] args) {
        Solution solution = new LinkedListComponents().new Solution();
    }

    //leetcode submit region begin(Prohibit modification and deletion)
    public class ListNode {
        int val;
        ListNode next;

        ListNode() {
        }

        ListNode(int val) {
            this.val = val;
        }

        ListNode(int val, ListNode next) {
            this.val = val;
            this.next = next;
        }
    }

    class Solution {
        public int numComponents(ListNode head, int[] nums) {
            Set<Integer> set = new HashSet<>();
            for (int num : nums) set.add(num);
            ListNode cur = head;
            int ans = 0, len = 0;
            while (cur != null) {
                if (set.contains(cur.val)) len++;
                else if (len != 0) {
                    ans++;
                    len = 0;
                }
                cur = cur.next;
            }

            return len == 0 ? ans : ans + 1;
        }
    }
//leetcode submit region end(Prohibit modification and deletion)

}
